package subjectlist;


/**
 * 写一个方法，检查字符串是否是整数，如果是，返回其整数值
 *
 * 分析与解答：整数分为负数与非负数，负数只有一种表示方法，而整数可以有两种表示方法。
 * 例如，-123，123，+123。因此，在判断字符串是否为整数时，需要把这几种问题都考虑到。下面主要介绍两种方法
 */
public class H如何判断字符串是否是整数 {


    /**
     * 方法一：
     * 递归法对于正数而言，如123，可以看成12×10+3，而12又可以看成1×10+2。
     * 而-123可以看成（-12）×10-3，-12可以被看成（-1）×10-2。
     * 根据这个特点可以采用递归的方法来求解，可以首先根据字符串的第一个字符确定正数的正负，
     * 接着对字符串从右往左遍历，假设字符串为“c1c2c3…cn”，如果cn不是整数，那么这个字符串不能表示成整数；
     * 如果这个数是非负数（c1!=‘-’），那么这个整数的值为“c1c2c3…cn-1”对应的整数值乘以10加上cn对应的整数值，如果这个数是负数（c1==‘-’），
     * 那么这个整数的值为c1c2c3…cn-1 对应的整数值乘以10减去cn对应的整数值。
     * 而求解子字符串“c1c2c3…sc-1”对应的整数的时候，可以用相同的方法来求解，因此可以采用递归的方法来求解。
     * 对于“+123”这种情况，可以首先去掉“+”，然后处理方法与“123”相同。
     * 由此可以得到递归表达式为：c1==′-′？toint（"c1c2c3…cn-1"）*10-（cn-'0'）：toint（"c1c2c3…cn-1"）*10+（cn-'0'）
     * 递归的结束条件为：当字符串长度为1时，直接返回字符对应的整数的值
     */

    private boolean flag;

    public boolean getFlag(){
        return flag;
    }
    //判断c是否是数字，如果是返回true，否在返回false
    private boolean isNumber(char c){
        return c>='0' && c<='9';
    }
    /**
     * 判断str是否是数字，如果是返回数字，且设置flag=true，否则设置flag=false
     * 输入参数：str为字符数组，length为数组长度，flag表示str是否是数字
     */
    private int strtoint(String str,int length){
        if (length > 1) {
            if (!isNumber(str.charAt(length - 1))) {
                //不是数字
                System.out.println("不是数字");
                flag=false;
                return -1;
            }
            return str.charAt(0)=='-'?
                    strtoint(str,length-1) * 10 -(str.charAt(length-1)-'0'):
                    strtoint(str,length-1) * 10 +str.charAt(length-1)-'0';
        }else {
            if(str.charAt(0)=='-'){
                return 0;
            }else {
                if (!isNumber(str.charAt(0))) {
                    System.out.println("不是数字");
                    flag=false;
                    return -1;
                }
                return str.charAt(0)-'0';
            }
        }
    }

    public int strToint(String s){
        flag=true;
        if (s == null || s.length() <= 0 || (s.charAt(0) == '-' && s.length() == 1)) {
            System.out.println("不是数字");
            flag=false;
            return -1;
        }
        if(s.charAt(0)=='+'){
            return strtoint(s.substring(1,s.length()),s.length()-1);
        }else{
            return strtoint(s,s.length());
        }
    }

    public static void main(String[] args) {
        H如何判断字符串是否是整数 t=new H如何判断字符串是否是整数();
        String s="-543";
        System.out.println(t.strToint(s));

        s="543";
        System.out.println(t.strToint(s));

        s="+543";
        System.out.println(t.strToint(s));

        s="++43";
        int result=t.strToint(s);
        if(t.getFlag()){
            System.out.println(result);
        }
    }
}
